#include <bits/stdc++.h>
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;

inline static int read(){
    int sum=0,neg=0,ch=getchar();
    while(!isdigit(ch)) neg|=(ch=='-'),ch=getchar();
    while(isdigit(ch)) sum=sum*10+(ch^48),ch=getchar();
    return neg?-sum:sum;
}

/*
怎么秒了，之前做这题想了很久也不会啊。也有可能是读错题了。
把所有进制为 1 的段缩成单点。首先找到单位价值最大的点 p，其后面那一段明显与前面无关，分治下去。
对于 p 前面这一段，把所有东西尽可能往 p 推，然后可以知道最多使得 p 有 x 个单位。
找到 [1,p] 最靠后的 x 个单位，把他们推到 p，于是 p 这个地方的贡献不可能更大了，再分治前面就行了
因为分治区间的 l 和 p 之间距离不会超过 logV，所以复杂度应该是 O(nlogV)
哦还有 v=0 的问题，问题还挺多
*/

constexpr int mod=998244353,inf=1e9; struct{int l,p; ll b;}a[200005];
int c[200005],lim[200005],R[200005];
int st[200005],bel[200005],nxt[200005]; ll b[200005],Ans;
void solve(int l,int r){
    l=nxt[a[l].l]; if(l>r || !c[l]) return; int p=l,_p=p; ll t=0,_t=0,s,val=-1;
    for(;val<=inf && p<=r;p++,t=(t+a[p-1].b)/lim[a[p].l-1],val*=lim[a[p].l-1])
        if(c[a[p].p]>val) val=c[a[p].p],_p=p,_t=t;
    p=_p,t=_t,s=max(a[p].b-b[a[p].p]+b[a[p].l-1],0ll),_t=a[p].b-s,Ans=(Ans+(t+_t)%mod*c[a[p].p])%mod;
    for(int i=p-1;t>0;i--) t=t*lim[a[i+1].l-1]-a[i].b,a[i].b=max(-t,0ll);
    if(l<p) solve(l,p-1); if(p+!s<=r) a[p]={a[p].p+1,R[a[p].p],s},solve(p+!s,r);
}

signed main(){
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    for(int T=1,n,m;T;printf("%lld\n",Ans),T--){
        n=read(),Ans=m=0,lim[n]=*c=INT_MAX;
        for(int i=1;i<=n;i++) c[i]=read(); for(int i=1;i<=n;i++) b[i]=read();
        for(int i=1;i<n;i++) lim[i]=read();
        for(int i=1;i<n;i++) if(!c[i]) b[i+1]+=b[i]/lim[i],b[i]%=lim[i]; partial_sum(b+1,b+n+1,b+1);
        for(int i=1,l=1,tp=0;i<=n;i++){
            bel[i]=m+1; for(int u=0;c[st[tp]]<c[i];tp--) R[st[tp]]=u,u=st[tp]; st[++tp]=i;
            if(lim[i]!=1){a[++m]={l,st[1],b[i]-b[l-1]},l=i+1; for(;tp;tp--) R[st[tp-1]]=st[tp];}
        } for(int i=n,p=m+1;i>=1;i--) nxt[i]=p=c[i]?bel[i]:p; a[m+1].l=n+1,solve(1,m);
    } return 0;
}